package wt.jly.filter;

import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.springframework.util.ObjectUtils;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * 自定义认证过滤器
 *      修改 RememberMe 的功能的bug
 *          在通过 RememberMe 登录之后，用户信息丢失的漏洞
 *
 * @author lanyangji
 * @date 2018/9/20 14:43
 */
public class UserFormAuthenticationFilter extends FormAuthenticationFilter {

    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
        Subject subject = getSubject(request, response);

        // 如果 isAuthenticated 为 false 证明不是登录过的，同时 isRemembered 为true
        // 证明是没有登录，但是是通过记住我功能进来的
        if (!subject.isAuthenticated() && subject.isRemembered()) {
            // 获取sesseion看看是不是空的
            Session session = subject.getSession(true);

            // 查看session属性当前是否为空
            if (ObjectUtils.isEmpty(session.getAttribute("user"))) {
                // 如果是空的才开始初始化
                session.setAttribute("user", subject.getPrincipal());
            }
        }

        // 这个方法本来只返回 subject.isAuthenticated() 现在我们加上 subject.isRemembered()
        // 让它同时兼容 remember 这种情况
        return subject.isAuthenticated() || subject.isRemembered();
    }
}
